home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 002 / ippon002.lzh / main.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  6KB  |  236 lines

  1. /* 男は一本槍 */
  2.  
  3. /* main.c */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <sys/dos.h>
  9. #include <sys/iocs.h>
  10. #include "XSP2lib.H"
  11.  
  12.  
  13. #define GLOBAL_DEFINE        /* グローバル変数を確保する */
  14. #include "main.h"
  15.  
  16. static int old_crtmod;
  17.  
  18. #define PCG_MAX    256        /* パターンデータの個数 */
  19. #define FRM_MAX    256        /* フレームデータの個数 */
  20. #define REF_MAX    256        /* リファレンスデータの個数 */
  21.  
  22. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  23. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  24. static XOBJ_REF_DAT ref_dat[REF_MAX];    /* リファレンスデータ */
  25. static XOBJ_FRM_DAT frm_dat[FRM_MAX];    /* フレームデータ */
  26.  
  27. static unsigned short pal_dat[16][15];    /* パレットデータ */
  28.  
  29.  
  30.  
  31. void usage (void)
  32. {
  33.     printf (
  34.                "縦スクロールシューティング・一本槍 IPPON.X ver0.02\n"
  35.                "        programmed by Mitsuky <FreeSoftware>\n"
  36.                "自機を表示して終了するだけ\n"
  37.         );
  38. }
  39.  
  40.  
  41.  
  42. /* 終了時に1度だけ呼ばれる・エラーだったら返ってこない */
  43. void Tini (void)
  44. {
  45.     int sp;
  46.  
  47.     switch (error_level) {
  48.     case ERROR_NON:
  49.         xsp_off ();
  50.         /* 画面モードを元に戻す */
  51.         sp = _iocs_b_super (0);
  52.         *(unsigned short *) 0xe8e006 &= 0xfffd;        /* HRL ビットを元に戻す */
  53.         _iocs_b_super (sp);
  54.         _iocs_crtmod (old_crtmod);
  55.         _dos_kflushio (0xff);    /* キーバッファをクリア */
  56.         /* break が無い事に注意 */
  57.  
  58.     case ERROR_FILE:
  59.         _iocs_tgusemd (1, 3);
  60.         /* break が無い事に注意 */
  61.     case ERROR_GUSEMD:
  62.         _iocs_tgusemd (0, 3);
  63.         /* break が無い事に注意 */
  64.     case ERROR_TUSEMD:
  65.         /* break が無い事に注意 */
  66.     default:
  67.         break;
  68.     }
  69.  
  70.     if (error_level != ERROR_NON) {
  71.         /* エラーが発生した場合 */
  72.         puts (error_message);
  73.         exit (-1);    /* 終了する */
  74.     }
  75. }
  76.  
  77.  
  78.  
  79. /* 起動時に1度だけ呼ばれる */
  80. static void Init (void)
  81. {
  82.     int sp;
  83.     int i, j, r;
  84.     static unsigned short crtcdata[9] =
  85.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 0x0111};
  86.     unsigned short *d;
  87.     FILE *fp;
  88.  
  89.     error_message = NULL;
  90.  
  91.     /* テキスト画面の使用状況をチェック */
  92.     error_level = ERROR_TUSEMD;
  93.     if (_iocs_tgusemd (1, -1) == 2) {    /* ユーザーが使用中なら */
  94.         error_message = "テキスト VRAM が使用中です";
  95.         Tini ();
  96.     }
  97.     _iocs_tgusemd (1, 2);
  98.     /* グラフィック画面の使用状況をチェック */
  99.     error_level = ERROR_GUSEMD;
  100.     i = _iocs_tgusemd (0, -1);
  101.     if ((i == 1) || (i == 2)) {    /* システムまたはユーザーが使用中なら */
  102.         error_message = "グラフィック VRAM が使用中です";
  103.         Tini ();
  104.     }
  105.     _iocs_tgusemd (0, 2);
  106.  
  107.  
  108.     /* 各種ファイル読み込み */
  109.     error_level = ERROR_FILE;
  110.     /* pcg_dat にパターンデータを読み込む */
  111.     fp = fopen ("PLAYER.XSP", "rb");
  112.     if (fp == NULL) {
  113.         error_message = "PLAYER.XSP が読めません";
  114.         Tini ();
  115.     }
  116.     fread (pcg_dat, sizeof (char), PCG_MAX * 128, fp);
  117.     fclose (fp);
  118.  
  119.     /* frm_dat にフレームデータを読み込む */
  120.     fp = fopen ("PLAYER.FRM", "rb");
  121.     if (fp == NULL) {
  122.         error_message = "PLAYER.FRM が読めません";
  123.         Tini ();
  124.     }
  125.     fread (frm_dat, sizeof (XOBJ_FRM_DAT), FRM_MAX, fp);
  126.     fclose (fp);
  127.  
  128.     /* ref_dat にリファレンスデータを読み込む */
  129.     fp = fopen ("PLAYER.REF", "rb");
  130.     if (fp == NULL) {
  131.         error_message = "PLAYER.REF が読めません";
  132.         Tini ();
  133.     }
  134.     r = fread (ref_dat, sizeof (XOBJ_REF_DAT), REF_MAX, fp);
  135.     fclose (fp);
  136.  
  137.     /* REF_DAT[].ptr 補正 */
  138.     for (i = 0; i < r; i++)
  139.         (int) ref_dat[i].ptr += (int) frm_dat;
  140.  
  141.  
  142.     /* pal_dat に一旦パレットデータを読み込む */
  143.     fp = fopen ("PLAYER.PAL", "rb");
  144.     if (fp == NULL) {
  145.         error_message = "PLAYER.PAL が読めません";
  146.         Tini ();
  147.     }
  148.     fread (pal_dat, sizeof (unsigned short), 16 * 15, fp);
  149.     fclose (fp);
  150.  
  151.     error_level = ERROR_NON;    /* エラーなし */
  152.  
  153.     /* XSP 関連の初期化 */
  154.     xsp_on ();
  155.     xsp_mode (3);
  156.     /* パターンデータを定義 */
  157.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  158.     xsp_objdat_set (ref_dat);
  159.  
  160.  
  161.     /* 画面モードの初期化 */
  162.     /* 256x256ドット 31kHz 256色モードに */
  163.     old_crtmod = _iocs_crtmod (-1);        /* 前の CRTMOD を保存 */
  164.     _iocs_crtmod (10);    /* 256x256dot 31kHz 256色 */
  165.     _iocs_g_clr_on ();    /* 一応 */
  166.     _iocs_sp_init ();    /* スプライトの初期化 */
  167.     _iocs_sp_on ();
  168.  
  169.     /* 256x256 正方形モードを作る */
  170.     sp = _iocs_b_super (0);
  171.     *(unsigned short *) 0xe80028 = crtcdata[8];
  172.     d = (unsigned short *) 0xe80002;
  173.     for (i = 1; i < 8; i++)
  174.         *d++ = crtcdata[i];
  175.     *(unsigned short *) 0xe80000 = crtcdata[0];
  176.  
  177.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  178.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  179.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  180.     *(unsigned short *) 0xeb080e = crtcdata[6];
  181.     *(unsigned int *) 0xe80018 = *(unsigned int *) 0xe8001c
  182.         = *(unsigned int *) 0xe80020 = *(unsigned int *) 0xe80024
  183.         = (0 << 16) + 0;    /* グラフィック画面の座標 */
  184.  
  185.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  186.     _iocs_b_super (sp);
  187.  
  188.     /* パレットデータを定義 */
  189.     /* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
  190.     {
  191.         unsigned short *p = (unsigned short *) pal_dat;
  192.         for (i = 1; i < 15; i++)
  193.             for (j = 0; j < 16; j++)
  194.                 _iocs_spalet (0x80000000 | j, i, *p++);
  195.     }
  196. }
  197.  
  198.  
  199.  
  200. /* ゲーム本体 */
  201. static void Game (void)
  202. {
  203.     int j;
  204.     int a_button;
  205.  
  206.     printf ("ジョイスティックの [A] ボタンを押すと終了します\n");
  207.  
  208.     /* [A] ボタンが押されるまでループ */
  209.     do {
  210.         j = _iocs_joyget (0);    /* ジョイスティック0番 */
  211.         /* [A] ボタンが押されたか? */
  212.         if ((j & 0b00100000) == 0)
  213.             a_button = !0;    /* 押された */
  214.         else
  215.             a_button = 0;    /* 押されていない */
  216.         xobj_set (80 + 32 * 2, 144, 2, 0x073f);    /* 自機を表示 */
  217.  
  218.         xsp_out ();    /* 表示 */
  219.     } while (a_button == 0);
  220. }
  221.  
  222.  
  223.  
  224. int main (int argc, char *argv[])
  225. {
  226.     if (argc != 1) {
  227.         usage ();
  228.         return (-1);
  229.     }
  230.     Init ();
  231.     Game ();
  232.     Tini ();
  233.  
  234.     return (0);
  235. }
  236.